package cn.hchaojie.spring.day02.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 切面，封装了我们需要动态添加的代码
 * 
 * @author hchaojie
 *
 */
//@Aspect
@Component
public class PostAspect {
//	public PostAspect() {
//		System.out.println("切面被创建。。。");
//	}
	
	// 需要加到目标方法之前的代码
	// 切入点表达式		
	// execution(访问修饰符 返回类型 类.方法(方法参数))
	@Before("execution(public * cn.hchaojie.spring.day02.service.PostService.add(..))")
	public void beforeAdvice() {
		long start = System.currentTimeMillis();
		System.out.println("执行开始时间点：" + start);
	}
	
	// 需要加到目标方法之后的代码
	@After("execution(* cn.hchaojie.spring.day02.service.*.*(..))")
	public void afterAdvice() {
		long end = System.currentTimeMillis();
		System.out.println("执行结束时间点：" + end);
	}
	
	// 这个通知只会作用到get方法上面
	@After("execution(* cn.hchaojie.spring..service.*.get*(..))")
	public void getAdvice() {
		System.out.println("get方法增强。。。");
	}
	
	// 根据方法参数匹配连接点
	@After("execution(* cn.hchaojie.spring..service.*.get*(String, int))")
	public void parameterAdvice() {
		System.out.println("参数匹配");
	}
	
	// 匹配包和子包的所有类
	@After("within(cn.hchaojie.spring.day02.service..*)")
	public void withinAdvice() {
		System.out.println("within匹配");
	}
	
	// 匹配实现了某个接口的类
	@After("target(java.io.Serializable)")
	public void interfaceAdvice() {
		System.out.println("接口匹配");
	}
}
